/**
 * 注意离散化的权值数组要用longlong，因为有乘二
 * 不然由于类型溢出导致超时
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;

struct FenwickTree{ // 树状数组

using value_type =int;
using vec_type = vector<value_type>;

int n;
vec_type c;

FenwickTree() = default;

static int lowbit(int x){return x & -x;}

void init(int nn){this->c.assign((this->n=nn) + 1, 0);}

void modify(int pos, value_type delta){
    for(int i=pos;i<=this->n;i+=lowbit(i)) this->c[i] += delta;
}

value_type query(int pos)const{
    value_type ans = 0;
    for(int i=pos;i;i-=lowbit(i)) ans += this->c[i];
    return ans;
}

value_type query(int s, int e)const{return this->query(e) - this->query(s - 1);}

}Bt;


struct Point{
    llt x, y;
    Point(llt a = 0, llt b = 0):x(a),y(b){}
    void input(){
        cin >> x >> y;
    }
};

// 顺时针45度
void rotate(Point & p){
    llt x = (p.x - p.y);
    llt y = (p.x + p.y);
    p.x = x, p.y = y;
}

int N, Q;
vector<Point> P, QP;

struct cdq_t{
    llt x;
    llt y;
    int pos;
    int flag;
    cdq_t(llt a=0, llt b=0, int c=0, int d=0):x(a),y(b),pos(c),flag(d){}
};

vector<llt> W;
vector<int> Ans;
vector<cdq_t> A;

void work(){
    cin >> N >> Q;
    P.assign(N, {});
    W.clear();
    W.reserve(N + Q + 1);
    W.emplace_back(-1E13);
    for(auto & p : P){
        p.input();
        p.x <<= 1;
        p.y <<= 1;
        rotate(p);
        W.emplace_back(p.y);
    }
    QP.assign(Q, {});
    for(auto & p : QP){
        llt k1, k2;
        cin >> k1 >> k2;
        p.x = (k2 - k1);
        p.y = (k1 + k2);
        rotate(p);
        W.emplace_back(p.y);        
    }

    sort(W.begin(), W.end());
    W.erase(unique(W.begin(), W.end()), W.end());

    A.clear();
    A.reserve(N + Q);
    int k = 0;
    for(const auto & p : QP){
        auto y = lower_bound(W.begin(), W.end(), p.y) - W.begin();
        A.push_back({p.x, y, k++, 0});
    }
    for(const auto & p : P){
        auto y = lower_bound(W.begin(), W.end(), p.y) - W.begin();
        A.push_back({p.x, y, k++, 1});        
    }

    sort(A.begin(), A.end(), [](const cdq_t & a, const cdq_t & b)->bool{
        if(a.x != b.x) return a.x > b.x;
        if(a.flag != b.flag) return a.flag < b.flag;
        if(a.y != b.y) return a.y < b.y;
        return a.pos < b.pos;
    });

    Bt.init(W.size());
    Ans.assign(Q, 0);

    for(const auto & p : A){
        if(p.flag){
            Bt.modify(p.y, 1);
        }else{
            Ans[p.pos] = Bt.query(1, p.y - 1);
        }
    }
    for(auto i : Ans) cout << i << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
    while(nofkase--) work();
	return 0;
}